package com.microservice.core.utils;

import org.mindrot.jbcrypt.BCrypt;

public class BCryptUtil {

    /**
     * 使用BCrypt加密密码
     *
     * @param password 明文密码
     * @return 加密后的密码
     * 这里加盐使用的是是BCrypt的默认盐值,也可以自定义盐值，传入参数BCrypt.gensalt(n)，n为盐值位数，默认为10，即2的10次方
     */
    public static String encrypt(String password) {
        return BCrypt.hashpw(password, BCrypt.gensalt());
    }

    /**
     * 验证密码是否与给定的哈希匹配
     *
     * @param password 明文密码(前端传来的密码原文,
     * 注意实际当中可能也会要求前端传来的密码不能是明文，你可以使用RSA非对称加密算法用公钥在前端加密好后到后端登录接口处使用私钥解密
     * 为什么不推荐使用AES呢，因为AES是对称加密算法，加密解密使用一个密钥,密钥会放在前端的js里，因为浏览器运行时会下载前端JS代码,仍然可以看到密钥,
     * 所以使用RSA或者其他的非对称加密算法，当然直接使用https方式是最好的)
     * @param hashedPassword 哈希过的密码(一般是数据库查询出的密码密文哈希)
     * @return 如果匹配则返回true，否则返回false
     */
    public static boolean validatePassword(String password, String hashedPassword) {
        return BCrypt.checkpw(password, hashedPassword);
    }
}
